﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using System.Threading.Tasks;
using System.Threading;

namespace ProjetGenGui
{
    /// <summary>
    /// Interaction logic for LaDataGrid.xaml
    /// </summary>
    public partial class LaDataGrid : UserControl
    {

        private Boolean _distant;
        private int _cle;
        private String _dico;

        public LaDataGrid()
        {
            InitializeComponent();
        }

        public LaDataGrid(String nomFichier)
        {
            InitializeComponent();
            txtFichier.Content = nomFichier;
        }

        public LaDataGrid(String nomFichier, Boolean traitementDistant, String dico)
        {
            InitializeComponent();
            txtFichier.Content = nomFichier;
            _distant = traitementDistant;
            _dico = dico;
        }

        private void ChoisirLeFichier(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.CheckPathExists = true;
            ofd.CheckFileExists = true;
            ofd.Title = "Ajouter des fichiers texte";
            ofd.Filter = "Fichiers .txt|*.txt";
            if (ofd.ShowDialog() == true)
                txtFichier.Content = ofd.FileName;
        }

        private void LancerTraitementFichier(object sender, RoutedEventArgs e)
        {
            LaunchTraitementFichier();
        }

        public void LaunchTraitementFichier()
        {
            webServiceDecode.STG varStg, varStgResult = null;
            List<Cl_decode> resultatLocal = new List<Cl_decode>();
            webServiceDecode.webDecodeSoapClient serviceDecode;
            traitementPdf fichierPdfDeSortie;
            Cl_decode DecodeXor, DecodeCesar;
            String nomFichierSortiePdf = "";
            String langueDico;
            String nomFichier;
            webServiceDecode.ArrayOfAnyType obj;

            try
            {
                langueDico = _dico;
                nomFichier = txtFichier.Content.ToString();

                webServiceLogin.Cl_decode decode = new webServiceLogin.Cl_decode();
                obj = new webServiceDecode.ArrayOfAnyType();
                obj.Add("Flo");
                obj.Add(fichierTxt.RecupererContenuDuFichier(nomFichier));
                obj.Add(langueDico);

                varStg = new webServiceDecode.STG();
                varStg.statut_op = false;
                varStg.info = txtFichier.Content.ToString();
                varStg.data = obj;



                serviceDecode = new webServiceDecode.webDecodeSoapClient();
                Task tache = new Task(() =>
                {
                    Dispatcher.Invoke(new Action(() => { btnLancer.Visibility = Visibility.Hidden; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                    Dispatcher.Invoke(new Action(() => { lblTraitementEnCours.Visibility = Visibility.Visible; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                    //si traitement en local, alors ajouter la clé et faire le décodage
                    if (this.TraitementADistance)
                    {
                        varStgResult = serviceDecode.m_service(varStg);
                    }
                    else
                    {
                        varStgResult = new webServiceDecode.STG();
                        varStgResult.data = new webServiceDecode.ArrayOfAnyType();
                        DecodeXor = new Cl_decode(this.Cle, fichierTxt.RecupererContenuDuFichier(nomFichier), this.LangueDico, "Xor"); DecodeXor.seconde = "0.0";
                        DecodeCesar = new Cl_decode(this.Cle, fichierTxt.RecupererContenuDuFichier(nomFichier), this.LangueDico, "Cesar"); DecodeCesar.seconde = "0.0";
                        varStgResult.data.Clear();
                        varStgResult.data.Add(DecodeXor.decrypterTout());
                        varStgResult.data.Add(DecodeCesar.decrypterTout());
                        //Thread.Sleep(1000);
                        varStgResult.statut_op = true;
                    }
                    if (varStgResult.statut_op)
                    {
                        txtFichier.Dispatcher.Invoke(new Action(() => { nomFichierSortiePdf = txtFichier.Content.ToString().Replace(".txt", ".pdf"); }), System.Windows.Threading.DispatcherPriority.Normal, null);
                        fichierPdfDeSortie = new traitementPdf(nomFichierSortiePdf);
                        if (this.TraitementADistance)
                        {
                            fichierPdfDeSortie.genererFichier(varStgResult.data);
                        }
                        else
                        {
                            fichierPdfDeSortie.genererFichierLocal(varStgResult.data);
                        }
                        fichierPdfDeSortie.sauvegarder();

                        Dispatcher.Invoke(new Action(() => { btnRechercheFichier.Visibility = Visibility.Hidden; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                        Dispatcher.Invoke(new Action(() => { lblTraitementEnCours.Visibility = Visibility.Hidden; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                        Dispatcher.Invoke(new Action(() => { btnConsulterPdf.Visibility = Visibility.Visible; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                        Dispatcher.Invoke(new Action(() => { btnLancer.Visibility = Visibility.Visible; btnLancer.Content = "Relancer"; }), System.Windows.Threading.DispatcherPriority.Normal, null);
                    }
                });
                tache.Start();
                //tache.Wait();
            }
            catch (Exception ex)
            {

            }

        }

        public Boolean TraitementADistance
        {
            get { return _distant; }
            set { _distant = value; }
        }

        public String LangueDico
        {
            get { return _dico; }
            set { _dico = value; }
        }

        public int Cle
        {
            get { return _cle; }
            set { _cle = value; }
        }

        private void LancerApercuDuPdf(object sender, RoutedEventArgs e)
        {
            apercuPDF page = new apercuPDF(txtFichier.Content.ToString().Replace(".txt", ".pdf"));
            page.Show();
        }

        private void ApresChargement(object sender, RoutedEventArgs e)
        {
            lblTraitementEnCours.Visibility = Visibility.Hidden;
        }

    }
}
